package com.sunday.redis.lua.autoconfiguration;

import com.sunday.redis.lua.core.RedisLuaTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * redis lua 自动配置类
 * Configuration                    从Spring3.0，@Configuration用于定义配置类，可替换xml配置文件，被注解的类内部包含有一个或多个被@Bean注解的方法，这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描，并用于构建bean定义，初始化Spring容器。
 * EnableConfigurationProperties    如果一个配置类只配置@ConfigurationProperties注解，而没有使用@Component，那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
 * ConfigurationProperties          修饰的类，加载到 Spring Env 中。
 * AutoConfigureBefore              在某些类装配之前加载
 * Import                           注解把用到的bean导入到了当前容器中。也可以导入一个配置类
 * ConditionalOnClass               注解的作用是当项目中存在某个类时才会使标有该注解的类或方法生效；
 * ConditionalOnMissingBean         它是修饰bean的一个注解，主要实现的是，当你的bean被注册之后，如果而注册相同类型的bean，就不会成功，它会保证你的bean只有一个，即你的实例只有一个，当你注册多个相同的bean时，会出现异常，以此来告诉人员。
 * ConditionalOnProperty            仅在存在环境属性且具有特定值的情况下才启用Bean注册。 默认情况下，必须定义指定的属性，并且不等于false。
 * DependsOn                        是用来表示一个bean A的实例化依赖另一个bean B的实例化， 但是A并不需要持有一个B的对象，如果需要的话就不用depends-on，直接用依赖注入就可以了或者ref标签。
 *
 * @author zsy
 * @since 2022/10/18
 */
@Slf4j
@Configuration
@ConditionalOnClass(RedisAutoConfiguration.class)
@AutoConfigureAfter(StringRedisTemplate.class)
public class RedisLuaAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(RedisLuaTemplate.class)
    public RedisLuaTemplate redisLuaTemplate(StringRedisTemplate stringRedisTemplate) {
        return new RedisLuaTemplate(stringRedisTemplate);
    }

}
